
#ifndef _GPIO_H_
#define _GPIO_H_

#include "mcu_base_def.h"

typedef struct{
    u32 GPIODATA[0x100];
    u32 GPIODIR;
    u32 GPIOIS;     //中断感测寄存器
    u32 GPIOIBE;    //中断边沿寄存器
    u32 GPIOIEV;    //中断事件寄存器
    u32 GPIOIE;     //中断位掩寄存器
    u32 GPIORIS;    //中断原生寄存器
    u32 GPIOMIS;    //中断
    u32 GPIOIC;     //中断清除
    u32 GPIOAFSEL;  //set:开启硬件模式,clr:软件模式
}gpio_type_t;

enum{
    gpio_type_t_sizeof = sizeof(gpio_type_t),
};

#define GPIO1_BASE 0x40012000
#define GPIO2_BASE 0x40013000
#define GPIO3_BASE 0x40014000

#define GPIO1 ((gpio_type_t*)GPIO1_BASE)
#define GPIO2 ((gpio_type_t*)GPIO2_BASE)
#define GPIO3 ((gpio_type_t*)GPIO3_BASE)

INLINE void     gpio_set(gpio_type_t*gpiox,uint8_t bit){ gpiox->GPIODATA[bit]=0xff;}
INLINE void     gpio_clr(gpio_type_t*gpiox,uint8_t bit){ gpiox->GPIODATA[bit]=0;}
INLINE void     gpio_set_value(gpio_type_t*gpiox,uint8_t bit,uint8_t val){ gpiox->GPIODATA[bit]=val; }
INLINE uint32_t gpio_get_value(gpio_type_t*gpiox,uint8_t bit){ return gpiox->GPIODATA[bit];}
INLINE void     gpio_set_input(gpio_type_t*gpiox,uint8_t bit){ gpiox->GPIODIR &= ~bit;}
INLINE void     gpio_set_output(gpio_type_t*gpiox,uint8_t bit){gpiox->GPIODIR |=  bit;}
INLINE void     gpio_int_clr(gpio_type_t*gpiox,uint8_t bit){gpiox->GPIOIC = bit;}
INLINE void     gpio_mode_hardware(gpio_type_t*gpiox,uint8_t bit){ gpiox->GPIOAFSEL |= bit; }
INLINE void     gpio_mode_software(gpio_type_t*gpiox,uint8_t bit){ gpiox->GPIOAFSEL &= ~bit;}


#endif
